﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace Aspfm.FtpFile
{
    internal class AspfmFtp
    {
        string ftpServerIP;
        string ftpRemotePath;
        string ftpUserID;
        string ftpPassword;
        string ftpURI;
        /// <summary>
        /// 连接FTP
        /// </summary>
        /// <param name="FtpServerIP">FTP连接地址</param>
        /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
        /// <param name="FtpUserID">用户名</param>
        /// <param name="FtpPassword">密码</param>
        public AspfmFtp(string FtpServerIP,string port,string FtpRemotePath, string FtpUserID, string FtpPassword)
        {
            ftpServerIP = FtpServerIP;
            ftpRemotePath = FtpRemotePath;
            ftpUserID = FtpUserID;
            ftpPassword = FtpPassword;
            ftpURI = "ftp://" + ftpServerIP + ":" + port + "/";
        }
        //上传文件
        public string UploadFile(string[] filePaths)
        {
            StringBuilder sb = new StringBuilder();
            if (filePaths != null && filePaths.Length > 0)
            {
                foreach (var file in filePaths)
                {
                    sb.Append(Upload(file));
                }
            }
            return sb.ToString();
        }
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="filename"></param>
        private string Upload(string filename)
        {
            FileInfo fileInf = new FileInfo(filename);
            if (!fileInf.Exists)
            {
                return filename + "not_find_file！";
            }
            FileStream fs = fileInf.OpenRead();
            return Upload(fs, filename);
        }
        public string Upload(Stream fs,string filename)
        {
            if (fs != null)
            {
                string errmsg = "";
                try
                {
                    if (!string.IsNullOrEmpty(ftpRemotePath))
                    {
                        string[] paths = ftpRemotePath.Split(new char[]{'/'},StringSplitOptions.RemoveEmptyEntries);
                        for (int i = 0; i < paths.Length; i++)
                        {
                            string path = "";
                            for (int j = 0; j <= i;j++ )
                            {
                                path += paths[j]+"/";
                            }
                            MakeDir(path);
                        }
                    }
                    string uri = ftpURI + ftpRemotePath+"/" + Path.GetFileName(filename);
                    FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                    reqFTP.KeepAlive = false;
                    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                    reqFTP.UseBinary = true;
                    reqFTP.UsePassive = false; //选择主动还是被动模式
                    //Entering Passive Mode
                    reqFTP.ContentLength = fs.Length;
                    using (Stream strm = reqFTP.GetRequestStream())
                    {
                        int contentLen;
                        int buffLength = 2048;
                        byte[] buff = new byte[buffLength];
                        contentLen = fs.Read(buff, 0, buffLength);
                        while (contentLen != 0)
                        {
                            strm.Write(buff, 0, contentLen);
                            contentLen = fs.Read(buff, 0, buffLength);
                        }
                        strm.Close();
                    }
                }
                catch (Exception ex)
                {
                    errmsg = "upload_FTP_error!_" + ftpURI+"_" +ftpUserID+"_"+ftpPassword+"：" + ex.Message;
                }
            }
            return "";
        }
        /// <summary>
        /// 下载
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="fileName"></param>
        public static string Download(string localFile, string FtpPath, string ftpServerIP, string port, string ftpUserID, string ftpPassword)
        {
            try
            {

                FileStream outputStream = new FileStream(localFile, FileMode.Create);
                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + ":" + port + "/" + FtpPath));
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                long cl = response.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                return "Download_error：" + "ftp://" + ftpServerIP + ":" + port + "/" + "_" + ftpUserID + "_" + ftpPassword + "：" + ex.Message;
            }
            return "";
        }
        ///// <summary>
        ///// 删除文件
        ///// </summary>
        ///// <param name="fileName"></param>
        //public void Delete(string fileName)
        //{
        //    try
        //    {
        //        string uri = ftpURI + fileName;
        //        FtpWebRequest reqFTP;
        //        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        //        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        //        reqFTP.KeepAlive = false;
        //        reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
        //        string result = String.Empty;
        //        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        //        long size = response.ContentLength;
        //        Stream datastream = response.GetResponseStream();
        //        StreamReader sr = new StreamReader(datastream);
        //        result = sr.ReadToEnd();
        //        sr.Close();
        //        datastream.Close();
        //        response.Close();
        //    }
        //    catch (Exception ex)
        //    {
        //        //Insert_Standard_ErrorLog.Insert("FtpWeb", "Delete Error --> " + ex.Message + " 文件名:" + fileName);
        //    }
        //}
        /// <summary>
        /// 获取当前目录下明细(包含文件和文件夹)
        /// </summary>
        /// <returns></returns>
        //public string[] GetFilesDetailList()
        //{
        //    string[] downloadFiles;
        //    try
        //    {
        //        StringBuilder result = new StringBuilder();
        //        FtpWebRequest ftp;
        //        ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
        //        ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        //        ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        //        WebResponse response = ftp.GetResponse();
        //        StreamReader reader = new StreamReader(response.GetResponseStream());
        //        string line = reader.ReadLine();
        //        line = reader.ReadLine();
        //        line = reader.ReadLine();
        //        while (line != null)
        //        {
        //            result.Append(line);
        //            result.Append("\n");
        //            line = reader.ReadLine();
        //        }
        //        result.Remove(result.ToString().LastIndexOf("\n"), 1);
        //        reader.Close();
        //        response.Close();
        //        return result.ToString().Split('\n');
        //    }
        //    catch (Exception ex)
        //    {
        //        downloadFiles = null;
        //        //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFilesDetailList Error --> " + ex.Message);
        //        return downloadFiles;
        //    }
        //}
        ///// <summary>
        ///// 获取当前目录下文件列表(仅文件)
        ///// </summary>
        ///// <returns></returns>
        //public string[] GetFileList(string mask)
        //{
        //    string[] downloadFiles;
        //    StringBuilder result = new StringBuilder();
        //    FtpWebRequest reqFTP;
        //    try
        //    {
        //        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
        //        reqFTP.UseBinary = true;
        //        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        //        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
        //        WebResponse response = reqFTP.GetResponse();
        //        StreamReader reader = new StreamReader(response.GetResponseStream());
        //        string line = reader.ReadLine();
        //        while (line != null)
        //        {
        //            if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
        //            {
        //                string mask_ = mask.Substring(0, mask.IndexOf("*"));
        //                if (line.Substring(0, mask_.Length) == mask_)
        //                {
        //                    result.Append(line);
        //                    result.Append("\n");
        //                }
        //            }
        //            else
        //            {
        //                result.Append(line);
        //                result.Append("\n");
        //            }
        //            line = reader.ReadLine();
        //        }
        //        result.Remove(result.ToString().LastIndexOf('\n'), 1);
        //        reader.Close();
        //        response.Close();
        //        return result.ToString().Split('\n');
        //    }
        //    catch (Exception ex)
        //    {
        //        downloadFiles = null;
        //        if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如，未找到文件，无法访问文件)。")
        //        {
        //            //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileList Error --> " + ex.Message.ToString());
        //        }
        //        return downloadFiles;
        //    }
        //}
        ///// <summary>
        ///// 获取当前目录下所有的文件夹列表(仅文件夹)
        ///// </summary>
        ///// <returns></returns>
        //public string[] GetDirectoryList()
        //{
        //    string[] drectory = GetFilesDetailList();
        //    string m = string.Empty;
        //    foreach (string str in drectory)
        //    {
        //        if (str.Trim().Substring(0, 1).ToUpper() == "D")
        //        {
        //            m += str.Substring(54).Trim() + "\n";
        //        }
        //    }
        //    char[] n = new char[] { '\n' };
        //    return m.Split(n);
        //}
        ///// <summary>
        ///// 判断当前目录下指定的子目录是否存在
        ///// </summary>
        ///// <param name="RemoteDirectoryName">指定的目录名</param>
        //public bool DirectoryExist(string RemoteDirectoryName)
        //{
        //    string[] dirList = GetDirectoryList();
        //    foreach (string str in dirList)
        //    {
        //        if (str.Trim() == RemoteDirectoryName.Trim())
        //        {
        //            return true;
        //        }
        //    }
        //    return false;
        //}
        ///// <summary>
        ///// 判断当前目录下指定的文件是否存在
        ///// </summary>
        ///// <param name="RemoteFileName">远程文件名</param>
        //public bool FileExist(string RemoteFileName)
        //{
        //    string[] fileList = GetFileList("*.*");
        //    foreach (string str in fileList)
        //    {
        //        if (str.Trim() == RemoteFileName.Trim())
        //        {
        //            return true;
        //        }
        //    }
        //    return false;
        //}
        /// <summary>
        /// 创建文件夹
        /// </summary>
        /// <param name="dirName"></param>
        public void MakeDir(string dirName)
        {
            try
            {
                // dirName = name of the directory to create.
                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                //Insert_Standard_ErrorLog.Insert("FtpWeb", "MakeDir Error --> " + ex.Message);
            }
        }
        ///// <summary>
        ///// 获取指定文件大小
        ///// </summary>
        ///// <param name="filename"></param>
        ///// <returns></returns>
        //public long GetFileSize(string filename)
        //{
        //    FtpWebRequest reqFTP;
        //    long fileSize = 0;
        //    try
        //    {
        //        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
        //        reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
        //        reqFTP.UseBinary = true;
        //        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        //        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        //        Stream ftpStream = response.GetResponseStream();
        //        fileSize = response.ContentLength;
        //        ftpStream.Close();
        //        response.Close();
        //    }
        //    catch (Exception ex)
        //    {
        //        //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileSize Error --> " + ex.Message);
        //    }
        //    return fileSize;
        //}
        ///// <summary>
        ///// 改名
        ///// </summary>
        ///// <param name="currentFilename"></param>
        ///// <param name="newFilename"></param>
        //public void ReName(string currentFilename, string newFilename)
        //{
        //    FtpWebRequest reqFTP;
        //    try
        //    {
        //        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
        //        reqFTP.Method = WebRequestMethods.Ftp.Rename;
        //        reqFTP.RenameTo = newFilename;
        //        reqFTP.UseBinary = true;
        //        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        //        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        //        Stream ftpStream = response.GetResponseStream();
        //        ftpStream.Close();
        //        response.Close();
        //    }
        //    catch (Exception ex)
        //    {
        //        //Insert_Standard_ErrorLog.Insert("FtpWeb", "ReName Error --> " + ex.Message);
        //    }
        //}
        ///// <summary>
        ///// 移动文件
        ///// </summary>
        ///// <param name="currentFilename"></param>
        ///// <param name="newFilename"></param>
        //public void MovieFile(string currentFilename, string newDirectory)
        //{
        //    ReName(currentFilename, newDirectory);
        //}
    }
}
